package com.ac.input.util;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;

// Referenced classes of package cn.edu.sut.oa.workadmin.sjcl:
//               JDBFException

public class JDBField
{

       public JDBField(String s, char c, int i, int j)
           throws JDBFException
       {
           if(s.length() > 10)
               throw new JDBFException("The field name is more than 10 characters long: " + s);
           if(c != 'C' && c != 'N' && c != 'L' && c != 'D' && c != 'F')
               throw new JDBFException("The field type is not a valid. Got: " + c);
           if(i < 1)
               throw new JDBFException("The field length should be a positive integer. Got: " + i);
           if(c == 'C' && i >= 254)
               throw new JDBFException("The field length should be less than 254 characters for character fields. Got: " + i);
           if(c == 'N' && i >= 21)
               throw new JDBFException("The field length should be less than 21 digits for numeric fields. Got: " + i);
           if(c == 'L' && i != 1)
               throw new JDBFException("The field length should be 1 characater for logical fields. Got: " + i);
           if(c == 'D' && i != 8)
               throw new JDBFException("The field length should be 8 characaters for date fields. Got: " + i);
           if(c == 'F' && i >= 21)
               throw new JDBFException("The field length should be less than 21 digits for floating point fields. Got: " + i);
           if(j < 0)
               throw new JDBFException("The field decimal count should not be a negative integer. Got: " + j);
           if((c == 'C' || c == 'L' || c == 'D') && j != 0)
               throw new JDBFException("The field decimal count should be 0 for character, logical, and date fields. Got: " + j);
           if(j > i - 1)
           {
               throw new JDBFException("The field decimal count should be less than the length - 1. Got: " + j);
           } else
           {
               name = s;
               type = c;
               length = i;
               decimalCount = j;
               return;
           }
       }

       public String getName()
       {
           return name;
       }

       public char getType()
       {
           return type;
       }

       public int getLength()
       {
           return length;
       }

       public int getDecimalCount()
       {
           return decimalCount;
       }

       public String format(Object obj)
           throws JDBFException
       {
           if(type == 'C' || type == 'N')
           {
               if(obj == null)
                   obj = "";
               if(obj instanceof String)
               {
                   String s = (String)obj;
                   if(s.length() > getLength())
                       throw new JDBFException("'" + obj + "' is longer than " + getLength() + " characters.");
                   StringBuffer stringbuffer = new StringBuffer(getLength() - s.length());
                   for(int i = 0; i < getLength() - s.length(); i++)
                       stringbuffer.append(' ');

                   return s + stringbuffer;
               } else
               {
                   throw new JDBFException("Expected a String, got " + obj.getClass() + ".");
               }
           }
           if(type == 'L')
           {
               if(obj == null)
                   obj = new Boolean(false);
               if(obj instanceof Boolean)
               {
                   Boolean boolean1 = (Boolean)obj;
                   return boolean1.booleanValue() ? "Y" : "N";
               } else
               {
                   throw new JDBFException("Expected a Boolean, got " + obj.getClass() + ".");
               }
           }
           if(type == 'D')
           {
               if(obj == null)
                   obj = new Date();
               if(obj instanceof Date)
               {
                   Date date = (Date)obj;
                   SimpleDateFormat simpledateformat = new SimpleDateFormat("yyyyMMdd");
                   return simpledateformat.format(date);
               } else
               {
                   throw new JDBFException("Expected a Date, got " + obj.getClass() + ".");
               }
           } else
           {
               throw new JDBFException("Unrecognized JDBFField type: " + type);
           }
       }

       public Object parse(String s)
           throws JDBFException
       {
           s = s.trim();
           if(type == 'N' || type == 'F')
           {
               if(s.equals(""))
                   s = "0";
               try
               {
                   if(getDecimalCount() == 0)
                       return new Long(s);
                   else
                       return new Double(s);
               }
               catch(NumberFormatException numberformatexception)
               {
                   throw new JDBFException(numberformatexception);
               }
           }
           if(type == 'C')
               return s;
           if(type == 'L')
           {
               if(s.equals("Y") || s.equals("y") || s.equals("T") || s.equals("t"))
                   return new Boolean(true);
               if(s.equals("N") || s.equals("n") || s.equals("F") || s.equals("f"))
                   return new Boolean(false);
               else
                   throw new JDBFException("Unrecognized value for logical field: " + s);
           }
           if(type == 'D')
           {
               SimpleDateFormat simpledateformat = new SimpleDateFormat("yyyyMMdd");
               try
               {
                   if("".equals(s))
                       return null;
                   else
                       return simpledateformat.parse(s);
               }
               catch(ParseException parseexception)
               {
                   throw new JDBFException(parseexception);
               }
           } else
           {
               throw new JDBFException("Unrecognized JDBFField type: " + type);
           }
       }

       public String toString()
       {
           return name;
       }

       private String name;
       private char type;
       private int length;
       private int decimalCount;
}